 /* 
 * Copyright 2013 Dominik Korittki, Steffen Gruschka

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
*/

package entity;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import org.hibernate.validator.constraints.Length;

/**
 * Repräsentation eines Mitarbeiters im System
 * @author Dominik K
 * @author Steffen G
 */
@Entity
public class Mitarbeiter implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * Kennkartennr, welche gleichzeitig die id des Mitarbeiters ist
     */
    @Id
    @Min(value=1, message="Validation: Geben Sie eine Kartennummer zwischen 1 und 6 Zeichen ein!")
    @Max(value=999999, message="Validation: Geben Sie eine Kartennummer zwischen 1 und 6 Zeichen ein!")
    @NotNull(message="Validation: Geben Sie eine Kartennummer zwischen 1 und 6 Zeichen ein!")
    private Long kennkartenNr;
    /**
     * Vorname des Mitarbeiters
     */
    @Column(nullable=false)
    @Length(min=1, max=50, message="Validation: Der Vorname muss zwischen 1 und 50 Zeichen besitzen")
    private String vorname;
    /**
     * Nachname des Mitarbeiters
     */
    @Column(nullable=false)
    @Length(min=1, max=50, message="Validation: Der Nachname muss zwischen 1 und 50 Zeichen besitzen")
    private String nachname;
    /**
     * Räume, zu welchem dieser Mitarbeiter Zugang hat
     */
    @ManyToMany(mappedBy = "befugte")
    private List<Raum> raeume = new ArrayList<Raum>();

    /**
     * Liefert die aktuelle Kennkarten Nummer
     * @return Kennkarten Nummer
     */
    public Long getKennkartenNr() {
        return kennkartenNr;
    }
    
    /**
     * Setzt eine neue KennkartenNr
     * @param kennkartenNr Neue KennkartenNr
     */
    public void setKennkartenNr(Long kennkartenNr) {
        this.kennkartenNr = kennkartenNr;
    }
    
    /**
     * Liefert den Vorname
     * @return der Vorname
     */
    public String getVorname() {
        return vorname;
    }
    
    /**
     * Setzt einen neuen Vorname
     * @param vorname neuer Vorname
     */
    public void setVorname(String vorname) {
        this.vorname = vorname;
    }
    
    /**
     * Liefert den Nachname
     * @return der Nachname
     */
    public String getNachname() {
        return nachname;
    }
    
    /**
     * Setzt einen neuen Nachnamen
     * @param nachname Neuer Nachname
     */
    public void setNachname(String nachname) {
        this.nachname = nachname;
    }
    
    /**
     * Liefert das raeume Objekt
     * @return Das Objekt
     */
    public List<Raum> getRaeume() {
        return raeume;
    }

    /**
     * Setzt ein neues Räume Objekt
     * @param raeume Neues Objekt
     */
    public void setRaeume(List<Raum> raeume) {
        this.raeume = raeume;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (kennkartenNr != null ? kennkartenNr.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Mitarbeiter)) {
            return false;
        }
        Mitarbeiter other = (Mitarbeiter) object;
        if ((this.kennkartenNr == null && other.kennkartenNr != null) || (this.kennkartenNr != null && !this.kennkartenNr.equals(other.kennkartenNr))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "entity.Mitarbeiter[ kennkartenNr=" + kennkartenNr + " ]";
    }

    /**
     * Raum hinzufügen, zu welchem der Mitarbeiter Zutritt haben soll
     * @param r 
     */
    public void raumHinzufuegen(Raum r) {
        raeume.add(r);
    }
    
    /**
     * Raum entfernen, zu welchem der Mitarbeiter Zutritt hatte
     * @param r 
     */
    public void raumEntfernen(Raum r) {
        raeume.remove(r);
    }
    
    /**
     * Alle Beziehungen zu Räumen löschen, zu welchem der Mitarbeiter Zutritt hatte
     */
    public void alleRaeumeEntfernen() {
        raeume.clear();
    }
}
